<?php
namespace Admin\Controller;
use Think\Controller;
// 继承公共的控制器
class CateController extends CommonController {

   public function _initialize(){
       parent::_initialize();
       // $access=\Home\Common\checkpower(9);
       // if($access!==0){
       //     $this->error('权限不够');
       // }
      }

   public function index(){
   	$type = M('category');
   	$data = $type->order('cate_path')->select();
   	
   	$this->assign("data", $data);
   	$this->display();
   }


   public function add(){
   	$type = M('category');
   	$data = $type->order('cate_path')->select();

   	$r = $this->nav_tree($data, 0);
   	$options = $this->option($r);

   	$this->assign('options',$options);
   	$this->display();
   }

   //启用相关栏目，如果启用底层栏目，也需要启用其直接的父级目录(如果被禁用的话)
   public function active_doit(){
      $type   = M('category');
      $cateId = I('get.cateid'); //获取cateId
      $data['id'] = $cateId;
      $data['status']   = 1;
      if($type->create($data)){
         $res = $type->save();
         if($res){
            $pid = $type->where('id='.$cateId)->getField('pid');
            $pstatus = $type->where('id='.$pid)->getField('status');
            if(!$pstatus){ //判断直接父级是否被禁用，如果禁用，则启用
               $data2['status'] = 1;
               $res2 = $type->where('id='.$pid)->save($data2);

               $ppid = $type->where('id='.$pid)->getField('pid');
               $ppstatus = $type->where('id='.$ppid)->getField('status');
               if(!$ppstatus){   //判断第二层父级是否被禁用，如果禁用，则启用
                  $data3['status'] = 1;
                  $res3 = $type->where('id='.$ppid)->save($data3);
               }
            }

            $this->success('启用成功',U('Cate/index'));
         }else{
            $this->error('启用失败',U('Cate/index'));
         }
      }
   }

    /**
     * 用来生成导航树数据
     * @param $data 分类数据
     * @param int 分类的父级id,默认为0，从根分类开始
     * @return array
     */
   protected function nav_tree($cate_arr, $pid=0){
   	$nav_tree = array();
   	foreach($cate_arr as $v){
   		if($v['pid'] == $pid){
   			$v['child'] = $this->nav_tree($cate_arr, $v['id']);
            $nav_tree[] = $v;
   		}
   	}
   	return $nav_tree;
   }

    /**
     * 将分类组织成固定格式的形式
     * @param $r
     * @return string
     */
   private function option($r){
   	$cateid = $_GET['cateid'] ? $_GET['cateid'] : 0;
   	$select = '';
   	$options = '<option value="0">根分类</option>';

   	foreach ($r as $v) {
   		//判断id是否和传过来的cateid相等
   		if($cateid==$v['id']){
   			$select = 'selected';
   		}
   		$options .= '<option value="'.$v['id'] . '" '.$select.'>&nbsp;&nbsp;'.$v['cate_name'].'</option>';
   		//再次清空select的值，不然如果第一次为selected，那么下一次也依然为selected
   		$select = '';
   		//如果其child数组不为空-->表示带有下级元素
   		//可以完善的地方，可以判断数组的长度，然后一直遍历到最后一层
   		if($v['child']){
   			foreach ($v['child'] as $vc) {
   				if($cateid==$vc['id']){
   					$select = "selected";
   				}
   			$options.= '<option value="'.$vc['id'].'" '.$select.'>&nbsp;&nbsp;&nbsp;&nbsp;'.$vc['cate_name'].'</option>';
   			//同样需要清空select的值
   			$select = "";
               if($vc['child']){
                  foreach ($vc['child'] as $vc2) {
                     if($cateid==$vc2['id']){
                        $select = "selected";
                     }
                  $options.= '<option value="'.$vc2['id'].'" '.$select.'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'.$vc2['cate_name'].'</option>';
                  //同样需要清空select的值
                  $select = "";
                  }
               }
   			}
   		}
   	}
   	return $options;
   }

   /**
    * 添加分类
    */
   public function add_doit(){
   		//获得传递过来的分类名称
   		$type = M('category');
   		
   		$data['cate_name'] = I('cate_name');
   		//如果不给父类id号的话，默认是0
   		$data['pid']  = I('pid', 0);

   		//拼凑路径，如果父类id是0(说明是一级分类),那么路径就是插入的ID号(可以由count + 1)获得，如果有传递父类id，那路劲就是 父类cate_path,本次插入的ID号(这里使用，作为分隔符),事实上，这是理想状态，即id号没有增加也没有删除
   		// 获得父类路径
         if(!$data['pid']){
            $pid_path = "0";
         }else{
             $pid_path = rtrim($type->find($data['pid'])['cate_path'],',');
         }

   		//第二种方法则是先插入部分数据，插入后然后获得插入的ID号，然后通过此ID号来跟新路径
   		// $r = $type->create($data)->add(); 最好的方法是使用事务
   		if($type->create($data)){
   			$r = $type->add();
   			if($r){
   				$id = $r;
   				$path['cate_path'] = $pid_path . "," . $r . ",";

   				if($type->create($path)){
   					$res =  $type->where("id = ".$id)->save();

   					if(false !== $res){
   						$this->success('新增成功',U('Cate/index'));
   					}else{
   						$this->error('添加分类失败',U('Cate/index'));
   					}
   				}
   				
   			}
   		}
   }


   //删除对应的分类
   //删除当前分类的时候，其子分类也需要删除(将它的status值设为0)
   function delete_doit(){
   	$type = M('category');
      $cateId = I('cateid');

      $data['id'] = $cateId;
      $data['status'] = 0;
   	$res = $type->save($data);
   	if($res){  //判断当前分类是否有子类，如果有的话就禁用其子类...
         $child = $type->where('pid='.$cateId)->getField('id',true);
         if($child){
            $child = array_values($child);
            $data2['id'] = array('in',$child);
            $data2['status'] = 1;
            $map['status'] = 0;
            $res = $type->where($data2)->save($map);

            $sonmap['pid'] = array('in',$child);
            $son = $type->where($sonmap)->getField('id',true);
            if($son){
               $son = array_values($son);
               $data3['id'] = array('in',$son);
               $data3['status'] = 1;
               $sondata['status'] = 0;
               $res = $type->where($data3)->save($sondata);
               // echo $type->getLastSql();
               // return;
            }
         }
   		$this->success('禁用成功',U('Cate/index'));
   	}else{
   		$this->error('禁用失败',U('Cate/index'));
   	}
   }


    /**
     * 修改相应分类名称
     */
   public function update(){
   	$type = M('category');
   	$id   = I('id');
   	$val  = $type->find($id);
    	$data = $type->order('cate_path')->select();

    	$r = $this->nav_tree($data, 0);
    	$options = $this->option($r);

    	$this->assign('val',$val);
    	$this->assign('options',$options);
      $this->display('update');
   }


   //修改分类
   function update_doit(){
   	$type = M('category');
   	$data = $type->create();
   	if($data){
   		$res = $type->save($data);
   		if(false !==$res){
   			$this->success('更新成功',U('Cate/index'));
   		}else{
   			$this->error('更新失败',U('Cate/index'));
   		}
   	}
   }


}